package cn.skyisazure.metacompare.sqlcompare.meta;

import cn.hutool.core.util.StrUtil;
import cn.skyisazure.metacompare.metaVo.EntityTableInfoVO;
import cn.skyisazure.metacompare.metaVo.MetaColumnRespVO;
import cn.skyisazure.metacompare.sqlcompare.mysql.MysqlColumnType;
import cn.skyisazure.metacompare.sqlcompare.utils.DBTypeConvert;
import cn.skyisazure.metacompare.sqlcompare.utils.DDLConstant;
import lombok.Data;
import lombok.NonNull;
import lombok.experimental.Accessors;

import java.io.Serializable;
import java.util.Objects;

/**
 * @Author lizhuyang
 */
@Data
@Accessors(chain = true)
public class ColumnCM {

    private Serializable id;

    /** 字段名 */
    private String name;
    /** 数据库字段类型 */
    private String type;
    /** 数据库字段类型 */
    private String oldType;
    /** 是否允许空 */
    private Boolean nullEnableFlag;
    /** 是否允许空 */
    private Boolean oldNullEnableFlag;
    /** 字段默认值模式（null、static、expression） */
    private String defaultValueMode;
    /** 字段默认值 */
    private String defaultValue;
    /** 注释 */
    private String comment;
    /** 额外信息：带auto_increment说明自增,时间自动添加等等.. */
    private String extra;
    /** 顺序值 */
    private Integer ordinalPosition;
    /** 表名 */
    private String tableName;
    /** 表id */
    private String tableId;
    /** 字符集 eg: CHARACTER SET utf8 COLLATE utf8_general_ci */
    private String charsetVar;

    /** 旧字段名（修改字段时设置此属性） */
    private String oldName;

    /** 原始枚举类型 */
    private MysqlColumnType columnTypeCompare;

    /** 是否是外键 */
    private Boolean foreignKeyFlag;
    /** 系统字段类型（缺外键、父级两种类型） */
    // private SystemColumnTypeEnum systemFieldType;

    public String getDefaultValue() {
        if (StrUtil.isBlank(defaultValue)) {
            return defaultValue;
        }
        String tempDefaultValue = defaultValue;
        if (tempDefaultValue.contains("\\")){
            tempDefaultValue = tempDefaultValue.replace("\\", "\\\\");
        }
        if (tempDefaultValue.contains("'")){
            tempDefaultValue = tempDefaultValue.replace("'", "\\'");
        }
        return tempDefaultValue;
    }

    public String getComment() {
        if (StrUtil.isBlank(comment)) {
            return comment;
        }
        String tempComment = comment;
        if (tempComment.contains("\\")){
            tempComment = tempComment.replace("\\", "\\\\");
        }
        if (tempComment.contains("'")){
            tempComment = tempComment.replace("'", "\\'");
        }
        return tempComment;
    }

    /**
     * 构建ColumnBO对象
     * @param field 原始 元数据对象
     * @return ColumnBO对象
     */
    public static ColumnCM build(@NonNull MetaColumnRespVO field,
                                 @NonNull DBTypeConvert dbTypeConvert,
                                 @NonNull EntityTableInfoVO entityTableInfo){
        ColumnCM column = new ColumnCM();
        column.setId(field.getQueryKey())
                .setName(field.getCode())
                .setType(dbTypeConvert.apply(field))
                .setColumnTypeCompare(field.getType())
                .setForeignKeyFlag(field.getForeignKeyFlag())
                // .setSystemFieldType(field.getSystemFieldType())
                .setDefaultValueMode(field.getDefaultValueMode()==null || field.getDefaultValueMode().equals("current_user")?"null":field.getDefaultValueMode())// 兼容不存在默认值mode的情况
                .setDefaultValue(field.getDefaultValue())
                .setNullEnableFlag(field.getNullable())
                .setExtra("")// 业务不存在自增字段、数据库自动添加日期等功能
                .setComment(field.getComment())
                .setOrdinalPosition(field.getSort())
                .setTableName(entityTableInfo.getMetaTable().getCode())
                .setTableId(entityTableInfo.getMetaTable().getQueryKey())
                .setCharsetVar("CHARACTER SET "+ DDLConstant.DEFAULTCHARSET +" COLLATE "+DDLConstant.DEFAULTCOLLATE);// 业务中没有做保存，均使用库中默认值，统一的。
        return column;
    }

    @Override
    public boolean equals(Object o) {
        if (this == o) return true;
        if (o == null || getClass() != o.getClass()) return false;
        ColumnCM columnCM = (ColumnCM) o;
        return Objects.equals(name, columnCM.name)
                && Objects.equals(type, columnCM.type)
                && Objects.equals(nullEnableFlag, columnCM.nullEnableFlag)
                && Objects.equals(defaultValue, columnCM.defaultValue)
                && Objects.equals(comment, columnCM.comment)
                && Objects.equals(tableName, columnCM.tableName);
    }

    @Override
    public int hashCode() {
        return Objects.hash(name, type, nullEnableFlag, defaultValue, comment, tableName);
    }
}
